[Unity] 簡單易用的免費線上排行榜服務 globalstat.io 與使用方法

[Unity] 簡單易用的免費線上排行榜服務 globalstat.io 與使用方法

[Unity] Free online leadboard service globalstat.io


2022/07/31 13:22:49

作為一個即將升上大四的老人,在中央創遊也待了三年,聽過很多社內社外講師的演講,也領略了很多遊戲製作的訣竅以及上架前後需要製作的事項。其中有一點我聽過非常多講師介紹過:在吸引到玩家遊玩後,要如何留住玩家?
從社群互動到持續更新新內容,從營造社群或是創造競爭環境,各方面去切入,方法可說是五花八門。而排行榜與成就的功能是其中一個很常見的例子。

有了排行榜,就會有玩家會想盡辦法站穩榜上的位置,一旦被其他人超越便會有所不甘,繼續在那邊「刷榜」,就算沒有任何獎勵也一樣。這時,遊戲的樂趣便已經從遊戲本身轉移到玩家間的競爭上,遊戲的黏著性也變得更高。

我之前的小作品 ryrysnake 排行榜
遊戲本身是滿好玩的 (但很冗,一場 5 分鐘多的音樂遊戲),沒想到會有人那麼努力在拚榜
有統計的玩家已經有超過 150 位

成就系統也有類似的概念,玩家為了達成成就而去遊玩遊戲,就好像我們在遊玩超級瑪利歐在尋求通關一樣,原本玩家可能已經對遊戲本身失去熱情,但為了達成這些遊戲設計者所預先設下的目標,玩家還是會繼續遊玩。

不只是遊戲,許多服務或系統都早已套用成就的系統來促進用戶的黏著性,像是 Google Play 推出的 Google Play Points、或是超商常見的集點卡等等都算是廣義的成就。

Google Play Points: 課金課越多越划算,吸引玩家在 Google Play 上消費

本篇要介紹的 globalstat.io,是一個簡單且完全開放的成就與排行榜網站,對於 Google Play 或是 Apple Game Center 等整合服務來說,這網站功能雖然很陽春,但對於我這種做網頁小遊戲、卻又不想自己刻個後端的人來說是個剛剛好的選擇。玩家不需要綁定任何帳號,只要填入暱稱就能放到榜上,在上傳成績時也能利用自己設的 ID 區分不同用戶,簡單而實用。

建立遊戲

進入 globalstats.io ,首先需要建立帳號,方法跟一般網站一樣,點選右上角 Sign Up 就可以開始註冊。依序填入帳號名稱、email 和密碼。

跑完註冊流程之後登入,點右上角帳號名稱 > Profile,之後選 My Games 就可以看到自己所註冊的遊戲。我們按 Register new Game 註冊新遊戲。

填入遊戲名稱並送出就完成遊戲的建立了,之後可以點選上面的 Edit Details 更改遊戲名稱或其他資訊、以及要不要在 globalstat 網站上公開顯示等。這裡我們先聚焦底下的欄位:

  • GTD 代表排行榜要記錄的資訊 (e.g. 分數)
  • Achievement 就是成就,可以選擇要不要與 GTD 連動
  • Access Token 呼叫 API 的金鑰

填入遊戲名稱並送出之後,有時候會跑出如下圖的錯誤

似乎是他們 API 沒寫好沒印出錯誤訊息,但我猜測是遊戲名稱被別人使用或不被接受 (例如我取名叫 test 就會出問題),可以嘗試回到上一頁更換遊戲名字。

設定 GTD

點集 Add GTD 添加排行榜要記錄的資訊。這裡我們要設定幾個欄位

  • Key 是我們待會在呼叫 API 時的欄位 ID,設定後就無法更改
  • Name 是顯示在排行榜時的欄位名稱
  • Short Name ? (最大 4 個字)
  • Type 欄位類型
    • Numeric 數字
    • Time 時間
    • Currency 貨幣 (顯示時會用 $X.XX 表示,要注意的是數值 123 代表 $1.23)
  • Sorting 排序
    • Larger is better 數值越大越好
    • Smaller is better 數值越小越好

設定好 GTD 之後應該會長這樣。 (拿上面提到的 ryrysnake 做範例)

使用 API 上傳資料

接下來我們要試著在我們的遊戲裡面呼叫 globalstat 的 API 了。先記錄下 Access Token 的 ID 與 Secret 兩項資訊。

官方提供的 API 在 https://github.com/globalstats-io/unity-library/blob/master/GlobalstatsIO.cs
把唯一一個腳本 GlobalstatsIO.cs 複製進 Unity 專案裡面。

接著寫一點點程式,在想要上傳成績的地方寫如以下的程式。
這裡我一樣拿 ryrysnake 的原始碼出來見客:

// Globalstats Access Token
string GlobalstatsIOApiId = "你剛剛紀錄的 Access Token ID";
string GlobalstatsIOApiSecret = "你剛剛紀錄的 Access Token Secret";

// Globalstats Data
Dictionary<string, string> payload = new Dictionary<string, string>();
payload.Add("s0", rec.Score.ToString("0"));
payload.Add("c0", rec.MaxCombo.ToString());
payload.Add("p0", rec.Hit_Perfect.ToString());
payload.Add("m0", rec.Hit_Miss.ToString());
payload.Add("f0", rec.FoodEaten.ToString());

// Globalstats: send
GlobalstatsIOClient gs = new GlobalstatsIOClient(GlobalstatsIOApiId, GlobalstatsIOApiSecret);
StartCoroutine(gs.Share(
values: payload,
id: "", // 資料 ID,要更改現有資料才需要指定
name: gameManager.playerName, // 玩家名字
callback: isSuccess=>{
// Callback
}));

就是這麼簡單。

獲取排行榜

GlobalstatsIO gs = new GlobalstatsIO(GlobalstatsIOApiId, GlobalstatsIOApiSecret);
string gtd = "score"
int limit = 2;

StartCoroutine(gs.GetLeaderboard(
gtd: "score",
limit: 10,
callback: leaderboard=>{
if (leaderboard != null)
{
// do something with leaderboard
}
else
{
// do something with error
}
}
));